#include "RotateButton.h"
#include <QEnterEvent>
#include <QResizeEvent>
#include <QPainterPath>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

RotateButton::RotateButton(RotateDirection direction, QWidget* parent) : QPushButton(parent), m_direction(direction), m_borderColor(Qt::black), m_borderWidth(2), m_arrowColor(Qt::black), m_isHovered(false)
{
    setFixedSize(80, 80);
    setCursor(Qt::PointingHandCursor);
    setAttribute(Qt::WA_Hover);

    // 设置背景为透明
    setStyleSheet("background-color: transparent;");

    // 生成缓存
    generateCache();
}

void RotateButton::setDirection(RotateDirection direction)
{
    if (m_direction != direction)
    {
        m_direction = direction;
        generateCache();
        update();
    }
}

void RotateButton::setBorderColor(const QColor& color)
{
    if (m_borderColor != color)
    {
        m_borderColor = color;
        generateCache();
        update();
    }
}

void RotateButton::setBorderWidth(int width)
{
    if (m_borderWidth != width && width > 0)
    {
        m_borderWidth = width;
        generateCache();
        update();
    }
}

void RotateButton::setArrowColor(const QColor& color)
{
    if (m_arrowColor != color)
    {
        m_arrowColor = color;
        generateCache();
        update();
    }
}

void RotateButton::generateCache()
{
    // 获取与按钮大小相同的缓存图像
    m_cache = QPixmap(size());
    m_cache.fill(Qt::transparent);

    QPainter painter(&m_cache);
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 设置统一的箭头颜色
    painter.setPen(QPen(m_arrowColor, 2));  // 设置线条颜色
    painter.setBrush(m_arrowColor);         // 设置填充颜色

    int arrowSize = qMin(width(), height()) * 0.4;
    int centerX = width() * 0.5;
    int centerY = height() * 0.5;

    // 根据方向绘制不同的箭头
    drawRotateArrow(painter, centerX, centerY, arrowSize, m_direction == RotateDirection::Clockwise);
}

void RotateButton::drawRotateArrow(QPainter& painter, int centerX, int centerY, int arrowSize, bool isClockwise)
{
    // 0度：3点钟方向（正右）
    // 90度：12点钟方向（正上）
    // 180度：9点钟方向（正左）
    // 270度：6点钟方向（正下）

    int circleRadius = arrowSize * 0.6;  // 圆的半径
    QRectF circleRect(centerX - circleRadius, centerY - circleRadius, circleRadius * 2, circleRadius * 2);

    QPainterPath path;
    if (isClockwise)
    {
        // 顺时针
        path.arcMoveTo(circleRect, 270);   // 移动到270度：6点钟方向（正下）
        path.arcTo(circleRect, 270, 270);  // 正下逆时针转270到最左
    }
    else
    {
        // 逆时针
        path.arcMoveTo(circleRect, 0);   // 移动到0度：3点钟方向（正右）
        path.arcTo(circleRect, 0, 270);  // 最右 逆时针270到最右
    }
    // 绘制圆弧路径
    QPen arcPen(m_arrowColor, arrowSize * 0.15);
    arcPen.setCapStyle(Qt::RoundCap);
    painter.strokePath(path, arcPen);

    // 绘制箭头头部
    QPolygonF arrowHead;
    qreal arrowHeadSize = arrowSize * 0.5;  // 箭头大小

    if (isClockwise)
    {
        // 顺时针：箭头在起点位置（270度，正下方），指向左侧
        // 起点向左arrowHeadSize 距离的点
        QPointF startPoint = QPointF(path.pointAtPercent(0).x() - arrowHeadSize, path.pointAtPercent(0).y());
        qreal angle = 0;  // 箭头指向角度（向左）

        arrowHead << startPoint << QPointF(startPoint.x() + arrowHeadSize * cos((angle - 30) * M_PI / 180.0), startPoint.y() + arrowHeadSize * sin((angle - 30) * M_PI / 180.0))
                  << QPointF(startPoint.x() + arrowHeadSize * cos((angle + 30) * M_PI / 180.0), startPoint.y() + arrowHeadSize * sin((angle + 30) * M_PI / 180.0));
    }
    else
    {
        // 逆时针：箭头在终点位置，指向右侧
        // 终点向右arrowHeadSize 距离的点
        QPointF endPoint = QPointF(path.pointAtPercent(1).x() + arrowHeadSize, path.pointAtPercent(1).y());
        qreal angle = 180;  // 箭头指向角度（向右）

        arrowHead << endPoint << QPointF(endPoint.x() + arrowHeadSize * cos((angle - 30) * M_PI / 180.0), endPoint.y() + arrowHeadSize * sin((angle - 30) * M_PI / 180.0))
                  << QPointF(endPoint.x() + arrowHeadSize * cos((angle + 30) * M_PI / 180.0), endPoint.y() + arrowHeadSize * sin((angle + 30) * M_PI / 180.0));
    }

    // 绘制箭头头部（使用相同的颜色）
    painter.setPen(Qt::NoPen);  // 无边框，只用填充色
    painter.setBrush(m_arrowColor);
    painter.drawPolygon(arrowHead);
}

void RotateButton::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 设置背景颜色为透明
    QColor backgroundColor = Qt::transparent;

    // 根据按钮状态设置背景颜色
    if (isDown())
    {
        backgroundColor = QColor(200, 200, 200, 120);  // 半透明灰色
    }
    else if (m_isHovered)
    {
        backgroundColor = QColor(220, 220, 220, 50);  // 半透明浅灰色
    }

    // 绘制按钮背景
    QRect innerRect = rect().adjusted(m_borderWidth, m_borderWidth, -m_borderWidth, -m_borderWidth);
    painter.setBrush(backgroundColor);
    painter.setPen(Qt::NoPen);
    painter.drawRoundedRect(innerRect, 8, 8);

    // 绘制边框
    painter.setBrush(Qt::NoBrush);
    painter.setPen(QPen(m_borderColor, m_borderWidth));
    painter.drawRoundedRect(innerRect, 8, 8);

    // 绘制缓存的箭头图像
    painter.drawPixmap(0, 0, m_cache);
}

bool RotateButton::event(QEvent* event)
{
    switch (event->type())
    {
        case QEvent::HoverEnter:
            m_isHovered = true;
            update();
            break;
        case QEvent::HoverLeave:
            m_isHovered = false;
            update();
            break;
        default:
            break;
    }
    return QPushButton::event(event);
}

void RotateButton::resizeEvent(QResizeEvent* event)
{
    QPushButton::resizeEvent(event);
    generateCache();
}